﻿/*
 * Created by SharpDevelop.
 * User: Lousabit
 * Date: 31/10/2011
 * Time: 2:48
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Business_Entity;
using DAOFactory;

namespace Business_Logic
{
	/// <summary>
	/// Description of BLDescuento.
	/// </summary>
	public class BLDescuento
	{
		public BLDescuento()
		{
		}
		
		public static List<BEDescuento> getDescuentos(int idDescuento, DateTime fechaIni, DateTime fechaFin){
			/*
			List<BEDescuento> lista = new List<BEDescuento>();
			
			BEProducto p = new BEProducto();
			p.Nombre = "Ricocan";
			BEDescuento d = new BEDescuento(1, 3,new DateTime(2011,5, 23), new DateTime(2013,9, 12), 23);
			d.agregarProducto(p);
			lista.Add(d);
			
			p = new BEProducto();
			p.Nombre = "Ricocrack";
			d = new BEDescuento(2, 10, new DateTime(2011, 4, 23), new DateTime(2014, 6, 6), 5);
			d.agregarProducto(p);
			lista.Add(d);
			*/
						
			return DAODescuento.getDescuentos(idDescuento, fechaIni, fechaFin);
			
		}
		
		public static void eliminarDescuentos(List<BEDescuento> descuentos){
			foreach(BEDescuento descuento in descuentos){
				DAODescuento.eliminarDescuento(descuento.Id);
			}
		}
		
		public static void getDescuentoCompleto(BEDescuento descuento){
			DAODescuento.getDescuentoCompleto(descuento);
		}
		
		public static void insert(BEDescuento descuento){
			DAODescuento.insert(descuento);
			
		}

		
		private static int getIndexParaInsertarLineaServicio(
			BEServicio servicio,
			List<List<BELineaPedidoServicio>> lineas
			){
			foreach(List<BELineaPedidoServicio> linea in lineas){
				if (servicio.Codigo == linea[0].Servicio.Codigo){
					return lineas.IndexOf(linea);
				}
			}
			
			return -1;
		}

		public static void aplicarDescuentosLineasServicios(BEPedidoVenta pedidoVenta){
			
			//lo primero es resetear todos los descuentos a null
			//porque es un recalculo
			foreach(BELineaPedidoServicio lineaServ in pedidoVenta.LineasPedidoServicio){
				lineaServ.Descuento = null;
			}
			
			
			//comienza el algoritmo de verdad
			
			List<List<BELineaPedidoServicio>> lineasServicio = new List<List<BELineaPedidoServicio>>();
			
			//para cada linea servicio del pedido de venta
			foreach(BELineaPedidoServicio linea in pedidoVenta.LineasPedidoServicio){
				int i = getIndexParaInsertarLineaServicio(linea.Servicio, lineasServicio);
				
				List<BELineaPedidoServicio> l;
				if (i == -1){
					lineasServicio.Add(new List<BELineaPedidoServicio>());
					l = lineasServicio[lineasServicio.Count-1];
				}else{
					l = lineasServicio[i];
				}
				
				l.Add(linea);
			}
			
			//lineasServicio tiene las lineas del pedido, agrupadas segun el servicio que
			//realizan
			foreach(List<BELineaPedidoServicio> grupoLineas in lineasServicio){
				int numLineas = grupoLineas.Count;
				int idServicio = grupoLineas[0].Servicio.Codigo;
				
				
				BEDescuento descuento = DAODescuento.getDescuentoByServicio(idServicio, pedidoVenta.Cliente.BeCategoriaCliente.IdCategoria);
				
				int descuentosAplicados = 0;
				
				if (descuento != null){
					if (numLineas >= descuento.CantidadMinima){
						//aplicar descuento a cada linea
						foreach(BELineaPedidoServicio lineaDescontar in grupoLineas){						
							lineaDescontar.Descuento = descuento;
							
							//hasta que llegue al maximo de descuentos
							//que se pueden aplicar
							descuentosAplicados ++;
							if (descuentosAplicados == descuento.CantidadMaxima) break;
						}
					}
				}
				
			}
			
		}
		
		public static void aplicarDescuentoLineaProducto(BELineaPedidoProducto lineaProducto, BEPedidoVenta pedidoVenta){
			
			int idCategoria;
			
			if (pedidoVenta.Cliente == null){
				idCategoria = 1; //BRONCE
			}else{
				if (pedidoVenta.Cliente.BeCategoriaCliente == null){
					idCategoria = 1;
				}else{
					idCategoria = pedidoVenta.Cliente.BeCategoriaCliente.IdCategoria;
				}
			}
			
			int idProducto = lineaProducto.Producto.Codigo;
			
						
			BEDescuento descuento = DAODescuento.getDescuentoByProducto(idProducto, idCategoria);
			
			if (descuento != null){
				if (descuento.CantidadMinima <= lineaProducto.Cantidad){
					lineaProducto.Descuento = descuento;
				}
			}
		}
		
		public static void aplicarDescuentos(BEPedidoVenta venta){
			//primero para lineasproducto
			foreach(BELineaPedidoProducto lineaProducto in venta.LineasPedidoProducto){
				lineaProducto.Descuento = null;
				aplicarDescuentoLineaProducto(lineaProducto, venta);
			}
			
			//ahora para lineasservicio
			/*
			foreach(BELineaPedidoServicio lineaServicio in venta.LineasPedidoServicio){
				aplicarDescuentoLineaServicio(lineaServicio, venta);
			}
			*/
			aplicarDescuentosLineasServicios(venta);
		}
	}
}
